////////////////////////////////////////////////////////////////////////////////
//
//  FLEX USER GROUP HOKURIKU
//  Copyright 2009 Flex User Group Hokuriku
//  All Rights Reserved.
// 
//  NOTICE: Flex User Group Hokuriku permits you to use, 
//  modify, and distribute this file 
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////
package net.fxug.hokuriku.chocolat.utils
{
    import flash.errors.IllegalOperationError;

    import mx.formatters.DateFormatter;

    /**
     * 日付関連の共通ユーティリティ
     * FIXME 名称がライブラリ側とパッケージが違うのにコンフリクトするので仮のクラス名
     * @author hikaruworld
     */
    public class DatetimeUtil
    {
        /** YYYY/MM/DD形式に変換するためのDateFormatter */
        private static var dateFormatter:DateFormatter;
        /** YYYY/MM/DD HH:NN:SS 形式に変換するためのDateFormatter */
        private static var datetimeFormatter:DateFormatter;

        {
            dateFormatter = new DateFormatter();
            dateFormatter.formatString = "YYYY/MM/DD";

            datetimeFormatter = new DateFormatter();
            datetimeFormatter.formatString = "YYYY/MM/DD HH:NN:SS";
        }

        /** 
		 * デフォルトコンストラクタ
         * @throws IllegalOperationError インスタンス生成が行われた場合にthrowされます。
		 */
		[Deprecated("このクラスのインスタンス化は許可されていません")]
        public function DatetimeUtil()
        {
            throw new IllegalOperationError("このクラスのインスタンス化は許可されていません");
        }

        /**
         * 渡された日付型をYYYY/MM/DD形式に変換する。
         * 日付変換に失敗した場合はNULLを返す。
         * @param	date 変換対象の日付
         * @return	YYYY/MM/DDの文字列形式で表現された日付
         */
        public static function getYYYMMDDtoDate(date:Date):String
        {
            if (date == null)
            {
                return null;
            }
            return dateFormatter.format(date);
        }

        /**
         * 渡された日付型をYYYY/MM/DD HH:NN:SS形式に変換する。
         * 日付変換に失敗した場合はNULLを返す。
         *
         * @param	date 変換対象の日付
         * @return	YYYY/MM/DD HH:NN:SSの文字列形式で表現された日付
         */
        public static function getYYYMMDDHHNNSStoDate(datetime:Date):String
        {
            if (datetime == null)
            {
                return null;
            }
            return datetimeFormatter.format(datetime);
        }

        /**
         * 渡されたDate型のインスタンスのミリ秒単位を<strong>切り捨てた</strong>ローカル時間を返す。
         * @param 変換対象のDate
         * @param ミリ秒を切り捨てて返す。
         */
        public static function roundDownByMillsecond(date:Date):Date
        {
            if (date == null)
            {
                return null;
            }
            var ret:Date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
            return ret;
        }

        /**
         * 渡された日付型を00:00分からの経過秒を計算して返す
         * 変換に失敗した場合は-1を返す。
         * @param	date 対象日
         * @return	00:00からの経過秒.秒数以下の端数に関しては切捨てされる。
         */
        public static function getTimeToDate(date:Date):int
        {
            if (date == null)
            {
                return -1;
            }
            var hourDateFormatter:DateFormatter = new DateFormatter();
            var minuteDateFormatter:DateFormatter = new DateFormatter();
            hourDateFormatter.formatString = "JJ";
            minuteDateFormatter.formatString = "NN";

            var sHour:String = hourDateFormatter.format(date);
            var sMinute:String = minuteDateFormatter.format(date);

//            trace("sHour is " + sHour + "; sMinute is " + sMinute);

            var hour:int = int(sHour);
            var minute:int = int(sMinute)

            return hour * 60 + minute;
        }

    }
}